/*******************************************************************************
* FileName:         CycLink.h
* Author:           李智铭
* Student Number:   3022206093
* Date:             2024/10.16 15:25:00
* Version:          v1.0
* Description:      Data Structure Experiment #2
*******************************************************************************/

#ifndef CYCLINK_H
#define CYCLINK_H

class CycLink
{
private:
    // 节点结构，包含值和指向下一个节点的指针。
    struct node {
        int value;       // 节点的值
        node* next;     // 指向下一个节点的指针
    };

    node* head; // 指向循环链表头节点的指针。
    int len;    // 循环链表中的元素数量。

public:
    /**
        构造函数，用于初始化CycLink。
        @name CycLink();
    */
    CycLink();

    /**
        析构函数，用于清理CycLink。
        @name ~CycLink();
    */
    ~CycLink();

    /**
        获取CycLink中的元素数量。
        @name length();
        @return int - 链表中元素的数量。
    */
    int length() const;

    /**
        获取指定位置（0基索引）元素的值。
        @name getData(const int&);
        @param location - 元素的位置。
        @return int - 指定位置的元素值。
                      如果位置超出范围，返回-1。
    */
    int getData(const int& location) const;

    /**
        在指定位置插入元素。
        @name insert(const int&, const int&);
        @param data - 要插入的数据。
               location - 数据应该插入的位置。
        @return void
    */
    void insert(const int& data, const int& location);

    /**
        移除指定位置的元素。
        @name remove(const int&);
        @param location - 要移除的元素的位置。
        @return bool - 移除成功返回true，失败返回false。
    */
    bool remove(const int& location);

    /**
        反转CycLink中的元素。
        @name converse();
        @return void
        例子：如果链表是 1 -> 2 -> 3 -> 4 -> 5，它将变为 5 -> 4 -> 3 -> 2 -> 1。
    */
    void converse();

    /**
        将另一个CycLink追加到当前链表。
        @name append(const CycLink&);
        @param append_list - 要追加到当前链表的链表。
        @return void
    */
    void append(const CycLink& append_list);
};

#endif // CYCLINK_H
